package com.ihy.controller;


import com.ihy.domain.Ur;
import com.ihy.domain.User;
import com.ihy.service.ServiceUr;
import com.ihy.service.ServiceUser;
import com.ihy.utils.RedisTemplateUtil;
import com.ihy.vo.ResultResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;

/**
 * 注册功能前端处理程序
 * <p>
 * RestController注解：
 * 相当于@ResponseBody ＋ @Controller合在一起的作用。
 * <p>
 * ResponseBody注解:
 * 将controller的方法返回的对象通过适当的转换器转换为指定的格式之后，写入到response对象的body区，通常用来返回JSON数据或者是XML数据。
 * 注意：在使用此注解之后不会再走视图处理器，而是直接将数据写入到输入流中，他的效果等同于通过response对象输出指定格式的数据。
 * <p>
 * Controller注解:
 * 用于标记在一个类上，使用它标记的类就是一个SpringMVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法，并检测该方法是否使用了@RequestMapping注解。
 * Controller注解只是定义了一个控制器类，而使用@RequestMapping 注解的方法才是真正处理请求的处理器。
 * <p>
 * CrossOrigin注解：
 * 出于安全原因，浏览器禁止Ajax调用驻留在当前原点之外的资源。例如，当你在一个标签中检查你的银行账户时，你可以在另一个选项卡上拥有EVILL网站。
 * 来自EVILL的脚本不能够对你的银行API做出Ajax请求（从你的帐户中取出钱！）使用您的凭据。
 * 跨源资源共享（CORS）是由大多数浏览器实现的W3C规范，允许您灵活地指定什么样的跨域请求被授权，而不是使用一些不太安全和不太强大的策略，如IFRAME或JSONP。
 * <p>
 * RequestMapping注解：
 * 是一个用来处理请求地址映射的注解，可用于类或方法上。用于类上，表示类中的所有响应请求的方法都是以该地址作为父路径。
 * <p>
 * Autowired注解:
 * 将构造函数、字段、setter方法或config方法标记为由Spring的依赖注入工具自动连接。
 * Autowired注解是按照类型（byType）装配依赖对象，默认情况下它要求依赖对象必须存在，如果允许null值，可以设置它的required属性为false。
 * 如果我们想使用按照名称（byName）来装配，可以结合@Qualifier注解一起使用。(通过类型匹配找到多个candidate,在没有@Qualifier、@Primary注解的情况下，会使用对象名作为最后的fallback匹配)
 **/
@RestController
//处理跨域请求
@CrossOrigin
@Slf4j
@RequestMapping("/Register")
public class RegisterController {
    @Autowired
    private ServiceUser serviceUser;
    @Autowired
    private ServiceUr serviceUr;
    @Autowired
    private RedisTemplateUtil redisTemplateUtil;
    @Autowired
    private ResultResponse resultResponse;

    //注册方法
    @RequestMapping("verifyUser")
    public ResultResponse verifyUser(User user) {
        User queryData;
        try {
            //查询当前用户输入的账户名数据库中是否存在
            queryData = serviceUser.query(user);
            //当返回的账户名信息不等于空的时候抛出异常提示用户名已经存在
            if (queryData != null) {
                resultResponse.setCode(401);
                resultResponse.setMessage("账户已存在");
                return resultResponse;
            } else {
                User userByPhone = serviceUser.getByPhone(user.getPhone());
                if (userByPhone != null) {
                    resultResponse.setCode(401);
                    resultResponse.setMessage("一个手机号只能注册一个账户");
                    return resultResponse;
                } else {
                    String phoneCode = (String) redisTemplateUtil.get(user.getPhone() + "PhoneCode");
                    if (phoneCode != null) {
                        if (phoneCode.equals(user.getPhoneCode())) {
                            //设置账户注册时间
                            user.setTime(new Date());
                            //当数据库返回的账户名不存在的时候进行注册操作
                            serviceUser.insert(user);
                            //注册过后进行一次查询，以保证后续操作
                            queryData = serviceUser.query(user);
                            //关联角色表信息
                            serviceUr.insert(new Ur(queryData.getId(), 2));
                            //删除缓存
                            redisTemplateUtil.del("redisCacheTime::" + user.getUsername());
                            //通过注册后删除验证码 节省内存
                            redisTemplateUtil.del(user.getPhone() + "PhoneCode");
                            resultResponse.setCode(200);
                            resultResponse.setData(user.getUsername());
                            resultResponse.setMessage("注册成功");
                            return resultResponse;
                        } else {
                            resultResponse.setCode(401);
                            resultResponse.setMessage("验证码错误");
                            return resultResponse;
                        }
                    } else {
                        resultResponse.setCode(401);
                        resultResponse.setMessage("验证码过期请重新获取");
                        return resultResponse;
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            resultResponse.setCode(401);
            resultResponse.setMessage(e.getMessage());
            return resultResponse;
        }
    }
}